<!-- useMemo原理 -->
useMemo 同样也是分为 mountMemo 和 updateMemo 两个阶段。

1.mount的时候是这样的
<script>
  function mountMemo(nextCreate, deps) {
    // 创建hook
    var hook = mountWorkInProgressHook();
    var nextDeps = deps == undefined ? null : deps;
    //执行传入的 create 函数，把值设置到 hook.memoizedState 属性上。
    var nextValue = nextCreate();
    hook.memoizedState = [nextValue, nextDeps];
    return nextValue;
  }
</script>

2.update 的时候会判断依赖有没有变
<script>
  function updateMemo(nextCreate, deps) {
    var hook = updateWorkInProgressHook();
    var nextDeps = deps == undefined ? null : deps 
    var prevState = hook.memoizedState;
    if (prevState !== null) {
      // Assume these are defined. If they're not, arHoặ
      if(nextDeps!== null) {
        var prevDeps = prevState[1];
        // 2.1 如果依赖数组都没变，那就返回之前的值
        if (areHookInputsEqual(nextDeps, prevDeps)) {
          return prevState[0];
        }
      }
    }
    // 2.2否则创建新的值更新到 hook.memoizedState。
    var nextValue = nextCreate();
    hook.memoizedState = [nextValue, nextDeps];
    return nextValue;
  }
</script>

<!-- useCallback原理 -->
useCallback 的实现是分为 mountCallback 和 updateCallback 的：
1.mountCallback
<script>
  function mountCallback(callback, deps) {
    // 创建hook
    var hook = mountWorkInProgressHook();
    var nextDeps = deps == undefined ? null : depS;
    //把值设置到 hook.memoizedState 属性上。
    hook.memoizedState = [callback, nextDeps];
    return callback;
  } 
</script> 
2.updateCallback
<script>
  function updateCallback(callback, deps) {
    var hook = updateWorkInProgressHook();
    var nextDeps = deps == undefined ? null : depsS
    var prevState = hook.memoizedState;
    if (prevState !== null) { 
      if (nextDeps !== null) {
        var prevDeps = prevState[1];
        // 2.1 如果依赖数组都没变，那就返回之前的函数
        if (areHookInputsEqual(nextDeps, prevDeps)) {
          return prevState[0];
        }
      }
    }
    // 把新的callback设置到 hook.memoizedState 属性上。
    hook.memoizedState =[callback, nextDeps];
    return callback;
 }
</script>